package com.hww.config;

import com.alibaba.ttl.TransmittableThreadLocal;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * @author: youdao.hww
 * @Date: 1/8/24
 * @Desc:
 */

@Component
public class LoginInfoHelper {


    /**
     * 正常情况下，当使用线程池或异步任务时，原始的ThreadLocal在线程切换或任务执行时无法将设置的值正确传递给子线程或后续任务。
     * 这使得在使用线程池或异步编程时，ThreadLocal的使用变得非常复杂。
     * <p>
     * TransmittableThreadLocal通过在线程切换时显式地传递ThreadLocal的值，解决了上述问题。
     * 它提供了一种机制，可以自动将ThreadLocal的值从父线程传递到子线程，并确保在整个任务调用链中正确传递。
     * <p>
     * 使用TransmittableThreadLocal时，您可以像使用普通的ThreadLocal一样设置和获取值，但它会自动处理值的传递。
     * 这样，即使在线程池或异步任务中，也能够正确地共享和传递ThreadLocal的值
     */
    private final TransmittableThreadLocal<SystemLoginInfo> loginInfoThreadLocal = new TransmittableThreadLocal<>();


    public void removeUserInfo() {
        loginInfoThreadLocal.remove();
    }


    /*获取登录信息*/
    public SystemLoginInfo getLoginInfo() {
        if (Objects.nonNull(loginInfoThreadLocal.get())) {
            return loginInfoThreadLocal.get();
        }
        //调用api获取登录信息
        return SystemLoginInfo.builder()
                .orgId(1L).campusId(1L).userId(1L).deptId(1L)
                .build();
    }

}
